package com.ygqh.common.config;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.ygqh.common.utils.DateUtils;
import org.springframework.http.MediaType;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

/**
 * 1.  引入fastJson依赖
 * 2. 自定义WebMvcConfigurer并继承WebMvcConfigurerAdapter
 * 3. 重写configureMessageConverters方法
 * * 4. 自定义配置FastJsonConfig
 * * 5. 将FastJsonHttpMessageConverter添加到HttpMessageConverter
 *
 * @author guohao
 * @date 2018/12/15 12:02
 */
public class LocalFastJsonHttpMessageConverter extends FastJsonHttpMessageConverter {

    public LocalFastJsonHttpMessageConverter() {
        super.setFastJsonConfig(getFastJsonConfig());
    }

    @Override
    public FastJsonConfig getFastJsonConfig() {
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(
                //List类型字段为null时输出[]而非null
                SerializerFeature.WriteNullListAsEmpty,
                //显示空字段
                SerializerFeature.WriteMapNullValue,
                //字符串类型字段为null时间输出""而非null
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteBigDecimalAsPlain,
                //Boolean类型字段为null时输出false而null
                SerializerFeature.WriteNullBooleanAsFalse,
                SerializerFeature.WriteDateUseDateFormat,
                //美化json输出，否则会作为整行输出
                SerializerFeature.PrettyFormat,
                //禁止循环引用
                SerializerFeature.DisableCircularReferenceDetect);

        config.setCharset(Charset.forName("UTF-8"));
        config.setDateFormat(DateUtils.DATE_TIME_FORMAT);
        return config;
    }

    @Override
    public List<MediaType> getSupportedMediaTypes() {
        List<MediaType> supportedMediaTypes = new ArrayList<>();
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
        supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        supportedMediaTypes.add(MediaType.APPLICATION_PDF);
        supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XML);
        supportedMediaTypes.add(MediaType.IMAGE_GIF);
        supportedMediaTypes.add(MediaType.IMAGE_JPEG);
        supportedMediaTypes.add(MediaType.IMAGE_PNG);
        supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
        supportedMediaTypes.add(MediaType.TEXT_HTML);
        supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
        supportedMediaTypes.add(MediaType.TEXT_PLAIN);
        supportedMediaTypes.add(MediaType.TEXT_XML);
        return supportedMediaTypes;
    }
}
